1 Set-up

if(!dir.exists("out")) {
    dir.create("out", showWarnings = FALSE, recursive = TRUE)
}

1.1 libs

suppressPackageStartupMessages({
    library(tidyverse)
    library(lubridate)
    library(broom)
    library(psych)
    library(heatmaply)
    library(patchwork)
    library(ComplexHeatmap)
})
nest <- nest_legacy
unnest <- unnest_legacy

1.2 Data Read-In

1.2.1 tRNA array probes

tRNAprobes <- 
read_delim( 
    delim = "\t",
    file = "../tRNA-GtRNAdb/450k_coresponding_hg19tRNAs.bed",
    col_types = "ciicciiciciicccc",
    col_names = c("pChr","pStart","pEnd","probeID",
        as.character(
            read_delim(
                delim = "\t",
                file = "../tRNA-GtRNAdb/std_tRNA_header.txt",
                col_names = FALSE,
                col_types = paste0(rep("c", 12), collapse = "")
            )
        )
    )
)

1.2.2 tRNAge gene set

tRNAge <- read_delim(
    delim = "\t",
     col_names = "tRNAname",
     col_types = "c",
     file = "../tRNA-GtRNAdb/GenWideSigWintRNAs.txt"
) %>%
    pull()

tRNAgeBB <- read_delim(
    delim = "\t",
     col_names = "tRNAname",
     col_types = "c",
     file = "../tRNA-GtRNAdb/BB_GWS_tRNA.txt"
) %>%
    pull()
swsBB23 <- read_tsv(
    "../tRNA-GtRNAdb/swsBB23.tsv",
    col_names = "tRNAname", col_types = "c"
) %>% pull()

gwsBB6 <- read_tsv(
    "../tRNA-GtRNAdb/BB_GWS_tRNA.txt",
    col_names = "tRNAname", col_types = "c"
) %>% pull()

bltRNAs <- read_tsv(
    "../tRNA-GtRNAdb/tRNAs-in-hg19-blacklist-v2.txt",
    col_names = "tRNAname", col_types = "c"
) %>% pull()

swsBB23bl <- swsBB23[!swsBB23 %in% bltRNAs]
gwsBB6bl <- gwsBB6[!gwsBB6 %in% bltRNAs]

1.2.3 Methylation Data

dataTest <- readRDS(
    file = "data/tRNAprobesNormCancerArrayPairs.Rds"
)
tRNAmethCancerNormal <- dataTest %>% 
    unnest() %>% 
    as_tibble() %>%
    filter(sample_type %in% c("Solid Tissue Normal", "Primary Tumor")) %>%
    mutate(tRNAge = tRNAname %in% swsBB23bl) %>%
    filter(!is.na(Beta_value))

samples used

tRNAmethCancerNormal %>% 
    distinct(file_id, file_name, sample_id, case_id, sample_type, primary_site, age) %>% 
    arrange(sample_type, primary_site, age) %>%
    write_tsv("out/TCGA_samples_used.tsv")
tRNAmethCancerNormal %>% distinct(case_id) %>% nrow()
[1] 733
tRNAsCovered <- 
tRNAmethCancerNormal %>% distinct(tRNAname)
tRNAsCovered
tRNAsCovered %>%
    filter(tRNAname %in% gwsBB6bl)

tRNAsCovered %>%
    filter(tRNAname %in% swsBB23bl)

2 variance

Levene <- 
onewaytests::homog.test(data = tRNAmethCancerNormal, Beta_value ~ sample_type, method = "Levene")

  Levene's Homogeneity Test (alpha = 0.05) 
----------------------------------------------- 
  data : Beta_value and sample_type 

  statistic  : 2782.235 
  num df     : 1 
  denum df   : 73405 
  p.value    : 0 

  Result     : Variances are not homogeneous. 
----------------------------------------------- 
#Levene %>% str()

Brown_forsythe <- 
onewaytests::bf.test(data = tRNAmethCancerNormal, Beta_value ~ sample_type)

  Brown-Forsythe Test (alpha = 0.05) 
------------------------------------------------------------- 
  data : Beta_value and sample_type 

  statistic  : 794.4947 
  num df     : 1 
  denom df   : 68163.63 
  p.value    : 8.495945e-174 

  Result     : Difference is statistically significant. 
------------------------------------------------------------- 
#Brown_forsythe %>% str()

3 By tRNA age modeling

3.1 Normal

normalAgeModelsBytRNA <- tRNAmethCancerNormal %>%
    dplyr::filter(sample_type == "Solid Tissue Normal") %>%
    group_by(tRNAname) %>%
    #group_by(tRNAname,primary_site) %>%
    nest() %>%
    mutate(model = purrr::map(data, ~ lm(age ~ Beta_value, data = .)))
#bonfer <- 0.05 / tRNAmethCancerNormal %>% dplyr::select(probeID) %>% distinct() %>% nrow()
bonfer <- 0.05 / normalAgeModelsBytRNA %>% nrow()
bonfer
[1] 0.001111111
normalAgeModelsBytRNAG <- normalAgeModelsBytRNA %>%
    unnest(model %>% purrr::map(glance)) %>% 
    arrange(p.value)
normalAgeModelsBytRNAG %>%
    dplyr::select(-data,-model)
normalAgeModelsBytRNAGsig <- normalAgeModelsBytRNAG %>%
    dplyr::select(-data, -model) %>%
    dplyr::filter(p.value < bonfer) %>% 
    arrange(p.value)

normalAgeModelsBytRNAGsig
normalAgeModelsBytRNA %>%
    unnest(model %>% purrr::map(tidy)) %>% 
    filter(term == "Beta_value", p.value < bonfer)
normalAgeModelsBytRNAGsig %>% distinct(tRNAname)
normalAgeModelsBytRNAGsig %>% 
    dplyr::filter(tRNAname %in% gwsBB6bl)

normalAgeModelsBytRNAGsig %>% 
    dplyr::filter(tRNAname %in% swsBB23bl)
# plots <- 
# tRNAmethCancerNormal %>%
#   group_by(aa) %>%
#   do(plot=
#       ggplot(aes())
#   )

3.1.1 Clustering

normalAgeModelsBytRNAG %>% select(-data, -model)

3.2 Cancer

cancerAgeModelsBytRNA <- tRNAmethCancerNormal %>%
    dplyr::filter(sample_type == "Primary Tumor") %>%
    group_by(tRNAname) %>%
    #group_by(tRNAname,primary_site) %>%
    nest() %>%
    mutate(model = purrr::map(data, ~ lm(age ~ Beta_value, data = .)))
cancerAgeModelsBytRNAG <- cancerAgeModelsBytRNA %>%
    unnest(model %>% purrr::map(glance)) %>% 
    arrange(p.value)
cancerAgeModelsBytRNAG %>%
    dplyr::select(-data, -model)
cancerAgeModelsBytRNAGsig <- cancerAgeModelsBytRNAG %>%
    dplyr::select(-data, -model) %>%
    dplyr::filter(p.value < bonfer) %>% 
    arrange(p.value)
cancerAgeModelsBytRNAGsig
cancerAgeModelsBytRNAGsig %>% distinct(tRNAname)
cancerAgeModelsBytRNAGsig %>% 
    dplyr::filter(tRNAname %in% swsBB23bl)

4 By tRNA and Tissue Age modeling

tRNAmethCancerNormal %>%
    dplyr::filter(sample_type == "Solid Tissue Normal") %>%
    group_by(tRNAname, primary_site) %>%
    summarise(n = n()) %>%
    spread(primary_site, n) %>%
    column_to_rownames("tRNAname") %>%
    data.matrix() %>% 
    #heatmaply()
    Heatmap(
        row_names_gp = gpar(fontsize = 8),
        na_col = "black",
        heatmap_width = unit(5.5, "inches"),
        heatmap_height = unit(7.5, "inches")#,
    )

ggplotly(dynamicTicks = TRUE,
tRNAmethCancerNormal %>%
    dplyr::filter(sample_type == "Solid Tissue Normal") %>%
    group_by(tRNAname, primary_site) %>%
    summarise(n = n()) %>%
    ggplot(aes(n)) + 
        geom_density(aes(colour = primary_site))
)
normalAgeModelsBytRNABySite <- tRNAmethCancerNormal %>%
    dplyr::filter(sample_type == "Solid Tissue Normal") %>%
    group_by(tRNAname, primary_site) %>%
    nest() %>%
    mutate(model = purrr::map(data, ~ lm(age ~ Beta_value, data = .)))
normalAgeModelsBytRNABySiteG <- normalAgeModelsBytRNABySite %>%
    unnest(model %>% purrr::map(glance)) %>% 
    arrange(p.value)
essentially perfect fit: summary may be unreliable
#normalAgeModelsBytRNABySiteG
bonfertRNATissue <- 0.05 / normalAgeModelsBytRNABySiteG %>% nrow()
bonfertRNATissue
[1] 5.868545e-05
normalAgeModelsBytRNABySiteGsig <- normalAgeModelsBytRNABySiteG %>%
    dplyr::filter(p.value < bonfertRNATissue) %>%
    dplyr::select(-data, -model)
normalAgeModelsBytRNABySiteGsig
normalAgeModelsBytRNABySiteGsig %>% 
    dplyr::filter(tRNAname %in% swsBB23bl)
normalAgeModelsBytRNABySiteG %>% 
    dplyr::select(-data, -model) %>%
    dplyr::filter(tRNAname %in% swsBB23bl) %>%
    dplyr::filter(p.value < bonfer) ###!!! not correcting for all tests - use bonfertRNATissue

4.0.1 Clustering

pvalueByTissueAndtRNA <- 
normalAgeModelsBytRNABySiteG %>%
    ungroup() %>%
    dplyr::select(-data, -model) %>%
    select(tRNAname, p.value, primary_site) %>%
    spread(primary_site, p.value)
    #tRNAname,primary_site,p.value
    #spread(tRNAname,p.value)

lowCoverageTissues <- 
normalAgeModelsBytRNABySiteG %>%
    ungroup() %>%
    dplyr::select(-data, -model) %>%
    select(tRNAname, p.value, primary_site) %>%
    group_by(primary_site) %>%
    summarise(Nna = length(which(is.na(p.value) | is.nan(p.value))), n = n(), p = Nna / n) %>%
    filter(p > 0.8) %>%
    mutate(primary_site = as.character(primary_site)) %>%
    pull(primary_site)

pvalueByTissueAndtRNAm <- 
pvalueByTissueAndtRNA %>%
    select(-tRNAname) %>%
    select(-lowCoverageTissues) %>%
    data.matrix()
    
rownames(pvalueByTissueAndtRNAm) <- pvalueByTissueAndtRNA$tRNAname

pvalueByTissueAndtRNAm %>% dim()
[1] 45 16
pvalueByTissueAndtRNAm %>% heatmaply::heatmaply(
    main = "Change in DNAm with Age by tissue (p-value)"
)
'heatmap' objects don't have these attributes: 'showlegend'
Valid attributes include:
'type', 'visible', 'opacity', 'name', 'uid', 'ids', 'customdata', 'meta', 'hoverinfo', 'hoverlabel', 'stream', 'transforms', 'uirevision', 'z', 'x', 'x0', 'dx', 'y', 'y0', 'dy', 'text', 'hovertext', 'transpose', 'xtype', 'ytype', 'zsmooth', 'connectgaps', 'xgap', 'ygap', 'zhoverformat', 'hovertemplate', 'zauto', 'zmin', 'zmax', 'zmid', 'colorscale', 'autocolorscale', 'reversescale', 'showscale', 'colorbar', 'coloraxis', 'xcalendar', 'ycalendar', 'xaxis', 'yaxis', 'idssrc', 'customdatasrc', 'metasrc', 'hoverinfosrc', 'zsrc', 'xsrc', 'ysrc', 'textsrc', 'hovertextsrc', 'hovertemplatesrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'
'heatmap' objects don't have these attributes: 'showlegend'
Valid attributes include:
'type', 'visible', 'opacity', 'name', 'uid', 'ids', 'customdata', 'meta', 'hoverinfo', 'hoverlabel', 'stream', 'transforms', 'uirevision', 'z', 'x', 'x0', 'dx', 'y', 'y0', 'dy', 'text', 'hovertext', 'transpose', 'xtype', 'ytype', 'zsmooth', 'connectgaps', 'xgap', 'ygap', 'zhoverformat', 'hovertemplate', 'zauto', 'zmin', 'zmax', 'zmid', 'colorscale', 'autocolorscale', 'reversescale', 'showscale', 'colorbar', 'coloraxis', 'xcalendar', 'ycalendar', 'xaxis', 'yaxis', 'idssrc', 'customdatasrc', 'metasrc', 'hoverinfosrc', 'zsrc', 'xsrc', 'ysrc', 'textsrc', 'hovertextsrc', 'hovertemplatesrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'

pvalueByTissueAndtRNAm %>%
Heatmap(
    na_col = "black",
    heatmap_width = unit(5.5, "inches"),
    heatmap_height = unit(7.5, "inches"),
    column_title_gp = gpar(fontsize = 16, fontface = "bold"),
    column_title = "Change in DNAm with Age\nby tissue (p-value)",
    name = "p-value\n",
    column_names_rot = 45,
    column_names_gp = gpar(fontsize = 10),
    row_names_gp = gpar(
        fontsize = 10,
        col = if_else(rownames(.) %in% tRNAgeBB, "red", "black")
    ),
    row_title = "tRNA gene"
)

#pvalueByTissueAndtRNAm %>%

tmp <- apply(data.matrix(pvalueByTissueAndtRNAm < 0.05), 2, as.character)
rownames(tmp) <- rownames(pvalueByTissueAndtRNAm)
tmp %>%
Heatmap(
    col = structure(c("red", "blue"), names = c("TRUE", "FALSE")),
    na_col = "black",
    heatmap_width = unit(5.5, "inches"),
    heatmap_height = unit(7.5, "inches"),
    column_title_gp = gpar(fontsize = 16, fontface = "bold"),
    column_title = "Change in DNAm with Age\nby tissue (p-value)",
    name = "p-value\n",
    column_names_rot = 45,
    column_names_gp = gpar(fontsize = 10),
    row_split = rownames(.) %>%
        gsub(pattern = "tRNA-(\\w+)-\\w+-\\w+-\\d+", replacement = "\\1"),
    row_names_gp = gpar(
        fontsize = 10,
        col = if_else(rownames(.) %in% tRNAgeBB, "red", "black")
    ),
    row_title = "tRNA gene"
)
normalAgeModelsBytRNABySiteGl <- 
normalAgeModelsBytRNABySiteG %>% 
    select(-data) %>% 
    unnest(model %>% map(broom::tidy)) %>% 
    select(-std.error, -statistic1, -p.value1) %>% 
    spread(term,estimate)
essentially perfect fit: summary may be unreliable
slopeByTissueAndtRNA <- 
normalAgeModelsBytRNABySiteGl %>%
    ungroup() %>%
    #dplyr::select(-data,-model) %>%
    select(tRNAname, Beta_value, primary_site) %>%
    #mutate(Beta_value = log(Beta_value)) %>%
    spread(primary_site, Beta_value)
    #tRNAname,primary_site,p.value
    #spread(tRNAname,p.value)

lowCoverageTissues <- 
normalAgeModelsBytRNABySiteGl %>%
    ungroup() %>%
    #dplyr::select(-data,-model) %>%
    select(tRNAname, Beta_value, primary_site) %>%
    group_by(primary_site) %>%
    summarise(Nna = length(which(is.na(Beta_value) | is.nan(Beta_value))), n = n(), p = Nna / n) %>%
    filter(p > 0.5) %>%
    mutate(primary_site = as.character(primary_site)) %>%
    pull(primary_site)

slopeByTissueAndtRNAm <- 
slopeByTissueAndtRNA %>%
    select(-tRNAname) %>%
    select(-lowCoverageTissues) %>%
    data.matrix()
    
rownames(slopeByTissueAndtRNAm) <- slopeByTissueAndtRNA$tRNAname

slopeByTissueAndtRNAm %>% dim()
[1] 45 18
slopeByTissueAndtRNAm %>% heatmaply::heatmaply(
    main = "Change in DNAm with Age by tissue (slope)"
)
'heatmap' objects don't have these attributes: 'showlegend'
Valid attributes include:
'type', 'visible', 'opacity', 'name', 'uid', 'ids', 'customdata', 'meta', 'hoverinfo', 'hoverlabel', 'stream', 'transforms', 'uirevision', 'z', 'x', 'x0', 'dx', 'y', 'y0', 'dy', 'text', 'hovertext', 'transpose', 'xtype', 'ytype', 'zsmooth', 'connectgaps', 'xgap', 'ygap', 'zhoverformat', 'hovertemplate', 'zauto', 'zmin', 'zmax', 'zmid', 'colorscale', 'autocolorscale', 'reversescale', 'showscale', 'colorbar', 'coloraxis', 'xcalendar', 'ycalendar', 'xaxis', 'yaxis', 'idssrc', 'customdatasrc', 'metasrc', 'hoverinfosrc', 'zsrc', 'xsrc', 'ysrc', 'textsrc', 'hovertextsrc', 'hovertemplatesrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'
'heatmap' objects don't have these attributes: 'showlegend'
Valid attributes include:
'type', 'visible', 'opacity', 'name', 'uid', 'ids', 'customdata', 'meta', 'hoverinfo', 'hoverlabel', 'stream', 'transforms', 'uirevision', 'z', 'x', 'x0', 'dx', 'y', 'y0', 'dy', 'text', 'hovertext', 'transpose', 'xtype', 'ytype', 'zsmooth', 'connectgaps', 'xgap', 'ygap', 'zhoverformat', 'hovertemplate', 'zauto', 'zmin', 'zmax', 'zmid', 'colorscale', 'autocolorscale', 'reversescale', 'showscale', 'colorbar', 'coloraxis', 'xcalendar', 'ycalendar', 'xaxis', 'yaxis', 'idssrc', 'customdatasrc', 'metasrc', 'hoverinfosrc', 'zsrc', 'xsrc', 'ysrc', 'textsrc', 'hovertextsrc', 'hovertemplatesrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'

slopeByTissueAndtRNAmHeatMap <- 
slopeByTissueAndtRNAm %>%
Heatmap(
    na_col = "black",
    heatmap_width = unit(5.5, "inches"),
    heatmap_height = unit(7.5, "inches"),
    column_title_gp = gpar(fontsize = 16, fontface = "bold"),
    column_title = "Change in DNAm with Age\nby tissue (slope)",
    name = "slope\n",
    column_names_rot = 45,
    column_names_gp = gpar(fontsize = 10),
    row_names_gp = gpar(
        fontsize = 10,
        col = if_else(rownames(.) %in% tRNAgeBB, "red", "black")
    ),
    row_title = "tRNA gene"
)

png(
    filename = "graphics/slopeByTissueAndtRNAmHeatMap_bl.png",
    width = 7, height = 8, units = "in", res = 192
)
slopeByTissueAndtRNAmHeatMap
dev.off()
jpeg 
   2 
slopeByTissueAndtRNAmHeatMap

slopeByTissueAndtRNAmAAsplitHeatMap <- 
slopeByTissueAndtRNAm %>%
Heatmap(
    na_col = "black",
    heatmap_width = unit(5.5, "inches"),
    heatmap_height = unit(7.5, "inches"),
    column_title_gp = gpar(fontsize = 16, fontface = "bold"),
    column_title = "Change in DNAm with Age\nby tissue (slope)",
    name = "slope\n",
    column_names_rot = 45,
    column_names_gp = gpar(fontsize = 10),
    row_split = rownames(.) %>%
        gsub(pattern = "tRNA-(\\w+)-\\w+-\\w+-\\d+", replacement = "\\1"),
    row_names_gp = gpar(
        fontsize = 10,
        col = if_else(rownames(.) %in% tRNAgeBB, "red", "black")
    ),
    row_title = "tRNA gene"
)

png(
    filename = "graphics/slopeByTissueAndtRNAmAAsplitHeatMap_bl.png",
    width = 7, height = 8, units = "in", res = 192
)
slopeByTissueAndtRNAmAAsplitHeatMap
dev.off()
jpeg 
   2 
slopeByTissueAndtRNAmAAsplitHeatMap

5 Session Info

sessionInfo()
R version 3.6.2 (2019-12-12)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.3 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so

locale:
 [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C               LC_TIME=en_GB.UTF-8       
 [4] LC_COLLATE=en_GB.UTF-8     LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
 [7] LC_PAPER=en_GB.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ComplexHeatmap_2.0.0 patchwork_0.0.1      heatmaply_0.16.0     viridis_0.5.1       
 [5] viridisLite_0.3.0    plotly_4.9.1         psych_1.8.12         broom_0.5.2         
 [9] lubridate_1.7.4      forcats_0.4.0        stringr_1.4.0        dplyr_0.8.3         
[13] purrr_0.3.3          readr_1.3.1          tidyr_1.0.0          tibble_2.1.3        
[17] ggplot2_3.2.1        tidyverse_1.2.1      testthat_2.3.0       devtools_2.2.1      
[21] usethis_1.5.1        reprex_0.3.0        

loaded via a namespace (and not attached):
  [1] readxl_1.3.1        backports_1.1.5     circlize_0.4.8      plyr_1.8.4         
  [5] lazyeval_0.2.2      crosstalk_1.0.0     digest_0.6.22       foreach_1.4.7      
  [9] htmltools_0.4.0     gdata_2.18.0        magrittr_1.5        memoise_1.1.0      
 [13] cluster_2.1.0       gclus_1.3.2         openxlsx_4.1.3      remotes_2.1.0      
 [17] modelr_0.1.5        prettyunits_1.0.2   colorspace_1.4-1    rvest_0.3.5        
 [21] haven_2.2.0         xfun_0.10           callr_3.3.2         crayon_1.3.4       
 [25] jsonlite_1.6        zeallot_0.1.0       iterators_1.0.12    glue_1.3.1         
 [29] registry_0.5-1      gtable_0.3.0        webshot_0.5.1       GetoptLong_0.1.7   
 [33] car_3.0-4           pkgbuild_1.0.6      shape_1.4.4         abind_1.4-5        
 [37] scales_1.0.0        Rcpp_1.0.3          xtable_1.8-4        clue_0.3-57        
 [41] foreign_0.8-72      htmlwidgets_1.5.1   httr_1.4.1          gplots_3.0.1.1     
 [45] RColorBrewer_1.1-2  ellipsis_0.3.0      pkgconfig_2.0.3     tidyselect_0.2.5   
 [49] labeling_0.3        rlang_0.4.1         reshape2_1.4.3      later_1.0.0        
 [53] munsell_0.5.0       cellranger_1.1.0    tools_3.6.2         cli_1.1.0          
 [57] generics_0.0.2      moments_0.14        evaluate_0.14       fastmap_1.0.1      
 [61] yaml_2.2.0          processx_3.4.1      knitr_1.25          fs_1.3.1           
 [65] zip_2.0.4           caTools_1.17.1.2    dendextend_1.12.0   packrat_0.5.0      
 [69] nlme_3.1-143        mime_0.7            xml2_1.2.2          compiler_3.6.2     
 [73] rstudioapi_0.10     curl_4.2            png_0.1-7           stringi_1.4.3      
 [77] ps_1.3.0            desc_1.2.0          lattice_0.20-38     vctrs_0.2.0        
 [81] pillar_1.4.2        lifecycle_0.1.0     GlobalOptions_0.1.1 data.table_1.12.6  
 [85] bitops_1.0-6        seriation_1.2-8     httpuv_1.5.2        R6_2.4.0           
 [89] onewaytests_2.4     promises_1.1.0      TSP_1.1-7           KernSmooth_2.23-16 
 [93] gridExtra_2.3       rio_0.5.16          sessioninfo_1.1.1   codetools_0.2-16   
 [97] MASS_7.3-51.5       gtools_3.8.1        assertthat_0.2.1    pkgload_1.0.2      
[101] rprojroot_1.3-2     rjson_0.2.20        withr_2.1.2         nortest_1.0-4      
[105] mnormt_1.5-5        parallel_3.6.2      hms_0.5.2           rmarkdown_1.16     
[109] carData_3.0-2       Cairo_1.5-10        shiny_1.4.0         base64enc_0.1-3    

6 References

LS0tCnRpdGxlOiAiMDUgLSBHZW5vbWljRGF0YUNvbW1vbnMgTm9ybWFsIFZzLiBDYW5jZXIgdGlzc3VlIHRSTkEgZ2VuZSBtZXRoeWxhdGlvbiAtIEFnZSBNb2RlbGluZyIKYXV0aG9yOiAiUmljaGFyZCBKLiBBY3RvbiIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfbm90ZWJvb2s6CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCmJpYmxpb2dyYXBoeTogImByIG5vcm1hbGl6ZVBhdGgoJy4uL2xpYnJhcnkuYmliJylgIgotLS0KCiMgU2V0LXVwCgpgYGB7cn0KaWYoIWRpci5leGlzdHMoIm91dCIpKSB7CglkaXIuY3JlYXRlKCJvdXQiLCBzaG93V2FybmluZ3MgPSBGQUxTRSwgcmVjdXJzaXZlID0gVFJVRSkKfQpgYGAKCiMjIGxpYnMKCmBgYHtyfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewoJbGlicmFyeSh0aWR5dmVyc2UpCglsaWJyYXJ5KGx1YnJpZGF0ZSkKCWxpYnJhcnkoYnJvb20pCglsaWJyYXJ5KHBzeWNoKQoJbGlicmFyeShoZWF0bWFwbHkpCglsaWJyYXJ5KHBhdGNod29yaykKCWxpYnJhcnkoQ29tcGxleEhlYXRtYXApCn0pCmBgYAoKYGBge3J9Cm5lc3QgPC0gbmVzdF9sZWdhY3kKdW5uZXN0IDwtIHVubmVzdF9sZWdhY3kKYGBgCgojIyBEYXRhIFJlYWQtSW4KCiMjIyB0Uk5BIGFycmF5IHByb2JlcwoKYGBge3J9CnRSTkFwcm9iZXMgPC0gCnJlYWRfZGVsaW0oCQoJZGVsaW0gPSAiXHQiLAoJZmlsZSA9ICIuLi90Uk5BLUd0Uk5BZGIvNDUwa19jb3Jlc3BvbmRpbmdfaGcxOXRSTkFzLmJlZCIsCgljb2xfdHlwZXMgPSAiY2lpY2NpaWNpY2lpY2NjYyIsCgljb2xfbmFtZXMgPSBjKCJwQ2hyIiwicFN0YXJ0IiwicEVuZCIsInByb2JlSUQiLAoJCWFzLmNoYXJhY3RlcigKCQkJcmVhZF9kZWxpbSgKCQkJCWRlbGltID0gIlx0IiwKCQkJCWZpbGUgPSAiLi4vdFJOQS1HdFJOQWRiL3N0ZF90Uk5BX2hlYWRlci50eHQiLAoJCQkJY29sX25hbWVzID0gRkFMU0UsCgkJCQljb2xfdHlwZXMgPSBwYXN0ZTAocmVwKCJjIiwgMTIpLCBjb2xsYXBzZSA9ICIiKQoJCQkpCgkJKQoJKQopCgpgYGAKCiMjIyB0Uk5BZ2UgZ2VuZSBzZXQKCmBgYHtyfQp0Uk5BZ2UgPC0gcmVhZF9kZWxpbSgKCWRlbGltID0gIlx0IiwKCSBjb2xfbmFtZXMgPSAidFJOQW5hbWUiLAoJIGNvbF90eXBlcyA9ICJjIiwKCSBmaWxlID0gIi4uL3RSTkEtR3RSTkFkYi9HZW5XaWRlU2lnV2ludFJOQXMudHh0IgopICU+JQoJcHVsbCgpCgp0Uk5BZ2VCQiA8LSByZWFkX2RlbGltKAoJZGVsaW0gPSAiXHQiLAoJIGNvbF9uYW1lcyA9ICJ0Uk5BbmFtZSIsCgkgY29sX3R5cGVzID0gImMiLAoJIGZpbGUgPSAiLi4vdFJOQS1HdFJOQWRiL0JCX0dXU190Uk5BLnR4dCIKKSAlPiUKCXB1bGwoKQpgYGAKCmBgYHtyfQpzd3NCQjIzIDwtIHJlYWRfdHN2KAoJIi4uL3RSTkEtR3RSTkFkYi9zd3NCQjIzLnRzdiIsCgljb2xfbmFtZXMgPSAidFJOQW5hbWUiLCBjb2xfdHlwZXMgPSAiYyIKKSAlPiUgcHVsbCgpCgpnd3NCQjYgPC0gcmVhZF90c3YoCgkiLi4vdFJOQS1HdFJOQWRiL0JCX0dXU190Uk5BLnR4dCIsCgljb2xfbmFtZXMgPSAidFJOQW5hbWUiLCBjb2xfdHlwZXMgPSAiYyIKKSAlPiUgcHVsbCgpCgpibHRSTkFzIDwtIHJlYWRfdHN2KAoJIi4uL3RSTkEtR3RSTkFkYi90Uk5Bcy1pbi1oZzE5LWJsYWNrbGlzdC12Mi50eHQiLAoJY29sX25hbWVzID0gInRSTkFuYW1lIiwgY29sX3R5cGVzID0gImMiCikgJT4lIHB1bGwoKQoKc3dzQkIyM2JsIDwtIHN3c0JCMjNbIXN3c0JCMjMgJWluJSBibHRSTkFzXQpnd3NCQjZibCA8LSBnd3NCQjZbIWd3c0JCNiAlaW4lIGJsdFJOQXNdCmBgYAoKIyMjIE1ldGh5bGF0aW9uIERhdGEKCmBgYHtyfQpkYXRhVGVzdCA8LSByZWFkUkRTKAoJZmlsZSA9ICJkYXRhL3RSTkFwcm9iZXNOb3JtQ2FuY2VyQXJyYXlQYWlycy5SZHMiCikKYGBgCgpgYGB7cn0KdFJOQW1ldGhDYW5jZXJOb3JtYWwgPC0gZGF0YVRlc3QgJT4lIAoJdW5uZXN0KCkgJT4lIAoJYXNfdGliYmxlKCkgJT4lCglmaWx0ZXIoc2FtcGxlX3R5cGUgJWluJSBjKCJTb2xpZCBUaXNzdWUgTm9ybWFsIiwgIlByaW1hcnkgVHVtb3IiKSkgJT4lCgltdXRhdGUodFJOQWdlID0gdFJOQW5hbWUgJWluJSBzd3NCQjIzYmwpICU+JQoJZmlsdGVyKCFpcy5uYShCZXRhX3ZhbHVlKSkKCmBgYAoKc2FtcGxlcyB1c2VkCgpgYGB7cn0KdFJOQW1ldGhDYW5jZXJOb3JtYWwgJT4lIAoJZGlzdGluY3QoZmlsZV9pZCwgZmlsZV9uYW1lLCBzYW1wbGVfaWQsIGNhc2VfaWQsIHNhbXBsZV90eXBlLCBwcmltYXJ5X3NpdGUsIGFnZSkgJT4lIAoJYXJyYW5nZShzYW1wbGVfdHlwZSwgcHJpbWFyeV9zaXRlLCBhZ2UpICU+JQoJd3JpdGVfdHN2KCJvdXQvVENHQV9zYW1wbGVzX3VzZWQudHN2IikKYGBgCgpgYGB7cn0KdFJOQW1ldGhDYW5jZXJOb3JtYWwgJT4lIGRpc3RpbmN0KGNhc2VfaWQpICU+JSBucm93KCkKYGBgCgpgYGB7cn0KdFJOQXNDb3ZlcmVkIDwtIAp0Uk5BbWV0aENhbmNlck5vcm1hbCAlPiUgZGlzdGluY3QodFJOQW5hbWUpCnRSTkFzQ292ZXJlZApgYGAKCmBgYHtyfQp0Uk5Bc0NvdmVyZWQgJT4lCglmaWx0ZXIodFJOQW5hbWUgJWluJSBnd3NCQjZibCkKCnRSTkFzQ292ZXJlZCAlPiUKCWZpbHRlcih0Uk5BbmFtZSAlaW4lIHN3c0JCMjNibCkKYGBgCgojIHZhcmlhbmNlCgpgYGB7cn0KTGV2ZW5lIDwtIApvbmV3YXl0ZXN0czo6aG9tb2cudGVzdChkYXRhID0gdFJOQW1ldGhDYW5jZXJOb3JtYWwsIEJldGFfdmFsdWUgfiBzYW1wbGVfdHlwZSwgbWV0aG9kID0gIkxldmVuZSIpCgojTGV2ZW5lICU+JSBzdHIoKQoKQnJvd25fZm9yc3l0aGUgPC0gCm9uZXdheXRlc3RzOjpiZi50ZXN0KGRhdGEgPSB0Uk5BbWV0aENhbmNlck5vcm1hbCwgQmV0YV92YWx1ZSB+IHNhbXBsZV90eXBlKQoKI0Jyb3duX2ZvcnN5dGhlICU+JSBzdHIoKQpgYGAKCiMgQnkgdFJOQSBhZ2UgbW9kZWxpbmcKCiMjIE5vcm1hbAoKYGBge3J9Cm5vcm1hbEFnZU1vZGVsc0J5dFJOQSA8LSB0Uk5BbWV0aENhbmNlck5vcm1hbCAlPiUKCWRwbHlyOjpmaWx0ZXIoc2FtcGxlX3R5cGUgPT0gIlNvbGlkIFRpc3N1ZSBOb3JtYWwiKSAlPiUKCWdyb3VwX2J5KHRSTkFuYW1lKSAlPiUKCSNncm91cF9ieSh0Uk5BbmFtZSxwcmltYXJ5X3NpdGUpICU+JQoJbmVzdCgpICU+JQoJbXV0YXRlKG1vZGVsID0gcHVycnI6Om1hcChkYXRhLCB+IGxtKGFnZSB+IEJldGFfdmFsdWUsIGRhdGEgPSAuKSkpCmBgYAoKYGBge3J9CiNib25mZXIgPC0gMC4wNSAvIHRSTkFtZXRoQ2FuY2VyTm9ybWFsICU+JSBkcGx5cjo6c2VsZWN0KHByb2JlSUQpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KCkKYm9uZmVyIDwtIDAuMDUgLyBub3JtYWxBZ2VNb2RlbHNCeXRSTkEgJT4lIG5yb3coKQpib25mZXIKYGBgCgpgYGB7cn0Kbm9ybWFsQWdlTW9kZWxzQnl0Uk5BRyA8LSBub3JtYWxBZ2VNb2RlbHNCeXRSTkEgJT4lCgl1bm5lc3QobW9kZWwgJT4lIHB1cnJyOjptYXAoZ2xhbmNlKSkgJT4lIAoJYXJyYW5nZShwLnZhbHVlKQpub3JtYWxBZ2VNb2RlbHNCeXRSTkFHICU+JQoJZHBseXI6OnNlbGVjdCgtZGF0YSwtbW9kZWwpCmBgYAoKYGBge3J9Cm5vcm1hbEFnZU1vZGVsc0J5dFJOQUdzaWcgPC0gbm9ybWFsQWdlTW9kZWxzQnl0Uk5BRyAlPiUKCWRwbHlyOjpzZWxlY3QoLWRhdGEsIC1tb2RlbCkgJT4lCglkcGx5cjo6ZmlsdGVyKHAudmFsdWUgPCBib25mZXIpICU+JSAKCWFycmFuZ2UocC52YWx1ZSkKCm5vcm1hbEFnZU1vZGVsc0J5dFJOQUdzaWcKYGBgCgpgYGB7cn0Kbm9ybWFsQWdlTW9kZWxzQnl0Uk5BICU+JQogICAgdW5uZXN0KG1vZGVsICU+JSBwdXJycjo6bWFwKHRpZHkpKSAlPiUgCglmaWx0ZXIodGVybSA9PSAiQmV0YV92YWx1ZSIsIHAudmFsdWUgPCBib25mZXIpCmBgYAoKYGBge3J9Cm5vcm1hbEFnZU1vZGVsc0J5dFJOQUdzaWcgJT4lIGRpc3RpbmN0KHRSTkFuYW1lKQpgYGAKCmBgYHtyfQpub3JtYWxBZ2VNb2RlbHNCeXRSTkFHc2lnICU+JSAKCWRwbHlyOjpmaWx0ZXIodFJOQW5hbWUgJWluJSBnd3NCQjZibCkKCm5vcm1hbEFnZU1vZGVsc0J5dFJOQUdzaWcgJT4lIAoJZHBseXI6OmZpbHRlcih0Uk5BbmFtZSAlaW4lIHN3c0JCMjNibCkKYGBgCgpgYGB7cn0KIyBwbG90cyA8LSAKIyB0Uk5BbWV0aENhbmNlck5vcm1hbCAlPiUKIyAJZ3JvdXBfYnkoYWEpICU+JQojIAlkbyhwbG90PQojIAkJZ2dwbG90KGFlcygpKQojIAkpCmBgYAoKIyMjIENsdXN0ZXJpbmcKCmBgYHtyfQpub3JtYWxBZ2VNb2RlbHNCeXRSTkFHICU+JSBzZWxlY3QoLWRhdGEsIC1tb2RlbCkKYGBgCgojIyBDYW5jZXIKCmBgYHtyfQpjYW5jZXJBZ2VNb2RlbHNCeXRSTkEgPC0gdFJOQW1ldGhDYW5jZXJOb3JtYWwgJT4lCglkcGx5cjo6ZmlsdGVyKHNhbXBsZV90eXBlID09ICJQcmltYXJ5IFR1bW9yIikgJT4lCglncm91cF9ieSh0Uk5BbmFtZSkgJT4lCgkjZ3JvdXBfYnkodFJOQW5hbWUscHJpbWFyeV9zaXRlKSAlPiUKCW5lc3QoKSAlPiUKCW11dGF0ZShtb2RlbCA9IHB1cnJyOjptYXAoZGF0YSwgfiBsbShhZ2UgfiBCZXRhX3ZhbHVlLCBkYXRhID0gLikpKQpgYGAKCmBgYHtyfQpjYW5jZXJBZ2VNb2RlbHNCeXRSTkFHIDwtIGNhbmNlckFnZU1vZGVsc0J5dFJOQSAlPiUKCXVubmVzdChtb2RlbCAlPiUgcHVycnI6Om1hcChnbGFuY2UpKSAlPiUgCglhcnJhbmdlKHAudmFsdWUpCmNhbmNlckFnZU1vZGVsc0J5dFJOQUcgJT4lCglkcGx5cjo6c2VsZWN0KC1kYXRhLCAtbW9kZWwpCmBgYAoKYGBge3J9CmNhbmNlckFnZU1vZGVsc0J5dFJOQUdzaWcgPC0gY2FuY2VyQWdlTW9kZWxzQnl0Uk5BRyAlPiUKCWRwbHlyOjpzZWxlY3QoLWRhdGEsIC1tb2RlbCkgJT4lCglkcGx5cjo6ZmlsdGVyKHAudmFsdWUgPCBib25mZXIpICU+JSAKCWFycmFuZ2UocC52YWx1ZSkKY2FuY2VyQWdlTW9kZWxzQnl0Uk5BR3NpZwpgYGAKCmBgYHtyfQpjYW5jZXJBZ2VNb2RlbHNCeXRSTkFHc2lnICU+JSBkaXN0aW5jdCh0Uk5BbmFtZSkKYGBgCgoKYGBge3J9CmNhbmNlckFnZU1vZGVsc0J5dFJOQUdzaWcgJT4lIAoJZHBseXI6OmZpbHRlcih0Uk5BbmFtZSAlaW4lIHN3c0JCMjNibCkKYGBgCgojIEJ5IHRSTkEgYW5kIFRpc3N1ZSBBZ2UgbW9kZWxpbmcKCmBgYHtyLGZpZy53aWR0aD02LGZpZy5oZWlnaHQ9OH0KdFJOQW1ldGhDYW5jZXJOb3JtYWwgJT4lCglkcGx5cjo6ZmlsdGVyKHNhbXBsZV90eXBlID09ICJTb2xpZCBUaXNzdWUgTm9ybWFsIikgJT4lCglncm91cF9ieSh0Uk5BbmFtZSwgcHJpbWFyeV9zaXRlKSAlPiUKCXN1bW1hcmlzZShuID0gbigpKSAlPiUKCXNwcmVhZChwcmltYXJ5X3NpdGUsIG4pICU+JQoJY29sdW1uX3RvX3Jvd25hbWVzKCJ0Uk5BbmFtZSIpICU+JQoJZGF0YS5tYXRyaXgoKSAlPiUgCgkjaGVhdG1hcGx5KCkKCUhlYXRtYXAoCgkJcm93X25hbWVzX2dwID0gZ3Bhcihmb250c2l6ZSA9IDgpLAoJCW5hX2NvbCA9ICJibGFjayIsCgkJaGVhdG1hcF93aWR0aCA9IHVuaXQoNS41LCAiaW5jaGVzIiksCgkJaGVhdG1hcF9oZWlnaHQgPSB1bml0KDcuNSwgImluY2hlcyIpIywKCSkKYGBgCgpgYGB7cn0KZ2dwbG90bHkoZHluYW1pY1RpY2tzID0gVFJVRSwKdFJOQW1ldGhDYW5jZXJOb3JtYWwgJT4lCglkcGx5cjo6ZmlsdGVyKHNhbXBsZV90eXBlID09ICJTb2xpZCBUaXNzdWUgTm9ybWFsIikgJT4lCglncm91cF9ieSh0Uk5BbmFtZSwgcHJpbWFyeV9zaXRlKSAlPiUKCXN1bW1hcmlzZShuID0gbigpKSAlPiUKCWdncGxvdChhZXMobikpICsgCgkJZ2VvbV9kZW5zaXR5KGFlcyhjb2xvdXIgPSBwcmltYXJ5X3NpdGUpKQopCmBgYAoKCmBgYHtyfQpub3JtYWxBZ2VNb2RlbHNCeXRSTkFCeVNpdGUgPC0gdFJOQW1ldGhDYW5jZXJOb3JtYWwgJT4lCglkcGx5cjo6ZmlsdGVyKHNhbXBsZV90eXBlID09ICJTb2xpZCBUaXNzdWUgTm9ybWFsIikgJT4lCglncm91cF9ieSh0Uk5BbmFtZSwgcHJpbWFyeV9zaXRlKSAlPiUKCW5lc3QoKSAlPiUKCW11dGF0ZShtb2RlbCA9IHB1cnJyOjptYXAoZGF0YSwgfiBsbShhZ2UgfiBCZXRhX3ZhbHVlLCBkYXRhID0gLikpKQpgYGAKCmBgYHtyfQpub3JtYWxBZ2VNb2RlbHNCeXRSTkFCeVNpdGVHIDwtIG5vcm1hbEFnZU1vZGVsc0J5dFJOQUJ5U2l0ZSAlPiUKCXVubmVzdChtb2RlbCAlPiUgcHVycnI6Om1hcChnbGFuY2UpKSAlPiUgCglhcnJhbmdlKHAudmFsdWUpCiNub3JtYWxBZ2VNb2RlbHNCeXRSTkFCeVNpdGVHCmBgYAoKYGBge3J9CmJvbmZlcnRSTkFUaXNzdWUgPC0gMC4wNSAvIG5vcm1hbEFnZU1vZGVsc0J5dFJOQUJ5U2l0ZUcgJT4lIG5yb3coKQpib25mZXJ0Uk5BVGlzc3VlCmBgYAoKCmBgYHtyfQpub3JtYWxBZ2VNb2RlbHNCeXRSTkFCeVNpdGVHc2lnIDwtIG5vcm1hbEFnZU1vZGVsc0J5dFJOQUJ5U2l0ZUcgJT4lCglkcGx5cjo6ZmlsdGVyKHAudmFsdWUgPCBib25mZXJ0Uk5BVGlzc3VlKSAlPiUKCWRwbHlyOjpzZWxlY3QoLWRhdGEsIC1tb2RlbCkKbm9ybWFsQWdlTW9kZWxzQnl0Uk5BQnlTaXRlR3NpZwpgYGAKCmBgYHtyfQpub3JtYWxBZ2VNb2RlbHNCeXRSTkFCeVNpdGVHc2lnICU+JSAKCWRwbHlyOjpmaWx0ZXIodFJOQW5hbWUgJWluJSBzd3NCQjIzYmwpCmBgYAoKYGBge3J9Cm5vcm1hbEFnZU1vZGVsc0J5dFJOQUJ5U2l0ZUcgJT4lIAoJZHBseXI6OnNlbGVjdCgtZGF0YSwgLW1vZGVsKSAlPiUKCWRwbHlyOjpmaWx0ZXIodFJOQW5hbWUgJWluJSBzd3NCQjIzYmwpICU+JQoJZHBseXI6OmZpbHRlcihwLnZhbHVlIDwgYm9uZmVyKSAjIyMhISEgbm90IGNvcnJlY3RpbmcgZm9yIGFsbCB0ZXN0cyAtIHVzZSBib25mZXJ0Uk5BVGlzc3VlCmBgYAoKIyMjIENsdXN0ZXJpbmcKCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9N30KcHZhbHVlQnlUaXNzdWVBbmR0Uk5BIDwtIApub3JtYWxBZ2VNb2RlbHNCeXRSTkFCeVNpdGVHICU+JQoJdW5ncm91cCgpICU+JQoJZHBseXI6OnNlbGVjdCgtZGF0YSwgLW1vZGVsKSAlPiUKCXNlbGVjdCh0Uk5BbmFtZSwgcC52YWx1ZSwgcHJpbWFyeV9zaXRlKSAlPiUKCXNwcmVhZChwcmltYXJ5X3NpdGUsIHAudmFsdWUpCgkjdFJOQW5hbWUscHJpbWFyeV9zaXRlLHAudmFsdWUKCSNzcHJlYWQodFJOQW5hbWUscC52YWx1ZSkKCmxvd0NvdmVyYWdlVGlzc3VlcyA8LSAKbm9ybWFsQWdlTW9kZWxzQnl0Uk5BQnlTaXRlRyAlPiUKCXVuZ3JvdXAoKSAlPiUKCWRwbHlyOjpzZWxlY3QoLWRhdGEsIC1tb2RlbCkgJT4lCglzZWxlY3QodFJOQW5hbWUsIHAudmFsdWUsIHByaW1hcnlfc2l0ZSkgJT4lCglncm91cF9ieShwcmltYXJ5X3NpdGUpICU+JQoJc3VtbWFyaXNlKE5uYSA9IGxlbmd0aCh3aGljaChpcy5uYShwLnZhbHVlKSB8IGlzLm5hbihwLnZhbHVlKSkpLCBuID0gbigpLCBwID0gTm5hIC8gbikgJT4lCglmaWx0ZXIocCA+IDAuOCkgJT4lCgltdXRhdGUocHJpbWFyeV9zaXRlID0gYXMuY2hhcmFjdGVyKHByaW1hcnlfc2l0ZSkpICU+JQoJcHVsbChwcmltYXJ5X3NpdGUpCgpwdmFsdWVCeVRpc3N1ZUFuZHRSTkFtIDwtIApwdmFsdWVCeVRpc3N1ZUFuZHRSTkEgJT4lCglzZWxlY3QoLXRSTkFuYW1lKSAlPiUKCXNlbGVjdCgtbG93Q292ZXJhZ2VUaXNzdWVzKSAlPiUKCWRhdGEubWF0cml4KCkKCQpyb3duYW1lcyhwdmFsdWVCeVRpc3N1ZUFuZHRSTkFtKSA8LSBwdmFsdWVCeVRpc3N1ZUFuZHRSTkEkdFJOQW5hbWUKCnB2YWx1ZUJ5VGlzc3VlQW5kdFJOQW0gJT4lIGRpbSgpCnB2YWx1ZUJ5VGlzc3VlQW5kdFJOQW0gJT4lIGhlYXRtYXBseTo6aGVhdG1hcGx5KAoJbWFpbiA9ICJDaGFuZ2UgaW4gRE5BbSB3aXRoIEFnZSBieSB0aXNzdWUgKHAtdmFsdWUpIgopCgpwdmFsdWVCeVRpc3N1ZUFuZHRSTkFtICU+JQpIZWF0bWFwKAoJbmFfY29sID0gImJsYWNrIiwKCWhlYXRtYXBfd2lkdGggPSB1bml0KDUuNSwgImluY2hlcyIpLAoJaGVhdG1hcF9oZWlnaHQgPSB1bml0KDcuNSwgImluY2hlcyIpLAoJY29sdW1uX3RpdGxlX2dwID0gZ3Bhcihmb250c2l6ZSA9IDE2LCBmb250ZmFjZSA9ICJib2xkIiksCgljb2x1bW5fdGl0bGUgPSAiQ2hhbmdlIGluIEROQW0gd2l0aCBBZ2VcbmJ5IHRpc3N1ZSAocC12YWx1ZSkiLAoJbmFtZSA9ICJwLXZhbHVlXG4iLAoJY29sdW1uX25hbWVzX3JvdCA9IDQ1LAoJY29sdW1uX25hbWVzX2dwID0gZ3Bhcihmb250c2l6ZSA9IDEwKSwKCXJvd19uYW1lc19ncCA9IGdwYXIoCgkJZm9udHNpemUgPSAxMCwKCQljb2wgPSBpZl9lbHNlKHJvd25hbWVzKC4pICVpbiUgdFJOQWdlQkIsICJyZWQiLCAiYmxhY2siKQoJKSwKCXJvd190aXRsZSA9ICJ0Uk5BIGdlbmUiCikKCiNwdmFsdWVCeVRpc3N1ZUFuZHRSTkFtICU+JQoKdG1wIDwtIGFwcGx5KGRhdGEubWF0cml4KHB2YWx1ZUJ5VGlzc3VlQW5kdFJOQW0gPCAwLjA1KSwgMiwgYXMuY2hhcmFjdGVyKQpyb3duYW1lcyh0bXApIDwtIHJvd25hbWVzKHB2YWx1ZUJ5VGlzc3VlQW5kdFJOQW0pCnRtcCAlPiUKSGVhdG1hcCgKCWNvbCA9IHN0cnVjdHVyZShjKCJyZWQiLCAiYmx1ZSIpLCBuYW1lcyA9IGMoIlRSVUUiLCAiRkFMU0UiKSksCgluYV9jb2wgPSAiYmxhY2siLAoJaGVhdG1hcF93aWR0aCA9IHVuaXQoNS41LCAiaW5jaGVzIiksCgloZWF0bWFwX2hlaWdodCA9IHVuaXQoNy41LCAiaW5jaGVzIiksCgljb2x1bW5fdGl0bGVfZ3AgPSBncGFyKGZvbnRzaXplID0gMTYsIGZvbnRmYWNlID0gImJvbGQiKSwKCWNvbHVtbl90aXRsZSA9ICJDaGFuZ2UgaW4gRE5BbSB3aXRoIEFnZVxuYnkgdGlzc3VlIChwLXZhbHVlKSIsCgluYW1lID0gInAtdmFsdWVcbiIsCgljb2x1bW5fbmFtZXNfcm90ID0gNDUsCgljb2x1bW5fbmFtZXNfZ3AgPSBncGFyKGZvbnRzaXplID0gMTApLAoJcm93X3NwbGl0ID0gcm93bmFtZXMoLikgJT4lCgkJZ3N1YihwYXR0ZXJuID0gInRSTkEtKFxcdyspLVxcdystXFx3Ky1cXGQrIiwgcmVwbGFjZW1lbnQgPSAiXFwxIiksCglyb3dfbmFtZXNfZ3AgPSBncGFyKAoJCWZvbnRzaXplID0gMTAsCgkJY29sID0gaWZfZWxzZShyb3duYW1lcyguKSAlaW4lIHRSTkFnZUJCLCAicmVkIiwgImJsYWNrIikKCSksCglyb3dfdGl0bGUgPSAidFJOQSBnZW5lIgopCmBgYAoKYGBge3IsZmlnLndpZHRoPTcsZmlnLmhlaWdodD04fQpub3JtYWxBZ2VNb2RlbHNCeXRSTkFCeVNpdGVHbCA8LSAKbm9ybWFsQWdlTW9kZWxzQnl0Uk5BQnlTaXRlRyAlPiUgCglzZWxlY3QoLWRhdGEpICU+JSAKCXVubmVzdChtb2RlbCAlPiUgbWFwKGJyb29tOjp0aWR5KSkgJT4lIAoJc2VsZWN0KC1zdGQuZXJyb3IsIC1zdGF0aXN0aWMxLCAtcC52YWx1ZTEpICU+JSAKCXNwcmVhZCh0ZXJtLGVzdGltYXRlKQoKc2xvcGVCeVRpc3N1ZUFuZHRSTkEgPC0gCm5vcm1hbEFnZU1vZGVsc0J5dFJOQUJ5U2l0ZUdsICU+JQoJdW5ncm91cCgpICU+JQoJI2RwbHlyOjpzZWxlY3QoLWRhdGEsLW1vZGVsKSAlPiUKCXNlbGVjdCh0Uk5BbmFtZSwgQmV0YV92YWx1ZSwgcHJpbWFyeV9zaXRlKSAlPiUKCSNtdXRhdGUoQmV0YV92YWx1ZSA9IGxvZyhCZXRhX3ZhbHVlKSkgJT4lCglzcHJlYWQocHJpbWFyeV9zaXRlLCBCZXRhX3ZhbHVlKQoJI3RSTkFuYW1lLHByaW1hcnlfc2l0ZSxwLnZhbHVlCgkjc3ByZWFkKHRSTkFuYW1lLHAudmFsdWUpCgpsb3dDb3ZlcmFnZVRpc3N1ZXMgPC0gCm5vcm1hbEFnZU1vZGVsc0J5dFJOQUJ5U2l0ZUdsICU+JQoJdW5ncm91cCgpICU+JQoJI2RwbHlyOjpzZWxlY3QoLWRhdGEsLW1vZGVsKSAlPiUKCXNlbGVjdCh0Uk5BbmFtZSwgQmV0YV92YWx1ZSwgcHJpbWFyeV9zaXRlKSAlPiUKCWdyb3VwX2J5KHByaW1hcnlfc2l0ZSkgJT4lCglzdW1tYXJpc2UoTm5hID0gbGVuZ3RoKHdoaWNoKGlzLm5hKEJldGFfdmFsdWUpIHwgaXMubmFuKEJldGFfdmFsdWUpKSksIG4gPSBuKCksIHAgPSBObmEgLyBuKSAlPiUKCWZpbHRlcihwID4gMC41KSAlPiUKCW11dGF0ZShwcmltYXJ5X3NpdGUgPSBhcy5jaGFyYWN0ZXIocHJpbWFyeV9zaXRlKSkgJT4lCglwdWxsKHByaW1hcnlfc2l0ZSkKCnNsb3BlQnlUaXNzdWVBbmR0Uk5BbSA8LSAKc2xvcGVCeVRpc3N1ZUFuZHRSTkEgJT4lCglzZWxlY3QoLXRSTkFuYW1lKSAlPiUKCXNlbGVjdCgtbG93Q292ZXJhZ2VUaXNzdWVzKSAlPiUKCWRhdGEubWF0cml4KCkKCQpyb3duYW1lcyhzbG9wZUJ5VGlzc3VlQW5kdFJOQW0pIDwtIHNsb3BlQnlUaXNzdWVBbmR0Uk5BJHRSTkFuYW1lCgpzbG9wZUJ5VGlzc3VlQW5kdFJOQW0gJT4lIGRpbSgpCnNsb3BlQnlUaXNzdWVBbmR0Uk5BbSAlPiUgaGVhdG1hcGx5OjpoZWF0bWFwbHkoCgltYWluID0gIkNoYW5nZSBpbiBETkFtIHdpdGggQWdlIGJ5IHRpc3N1ZSAoc2xvcGUpIgopCgpzbG9wZUJ5VGlzc3VlQW5kdFJOQW1IZWF0TWFwIDwtIApzbG9wZUJ5VGlzc3VlQW5kdFJOQW0gJT4lCkhlYXRtYXAoCgluYV9jb2wgPSAiYmxhY2siLAoJaGVhdG1hcF93aWR0aCA9IHVuaXQoNS41LCAiaW5jaGVzIiksCgloZWF0bWFwX2hlaWdodCA9IHVuaXQoNy41LCAiaW5jaGVzIiksCgljb2x1bW5fdGl0bGVfZ3AgPSBncGFyKGZvbnRzaXplID0gMTYsIGZvbnRmYWNlID0gImJvbGQiKSwKCWNvbHVtbl90aXRsZSA9ICJDaGFuZ2UgaW4gRE5BbSB3aXRoIEFnZVxuYnkgdGlzc3VlIChzbG9wZSkiLAoJbmFtZSA9ICJzbG9wZVxuIiwKCWNvbHVtbl9uYW1lc19yb3QgPSA0NSwKCWNvbHVtbl9uYW1lc19ncCA9IGdwYXIoZm9udHNpemUgPSAxMCksCglyb3dfbmFtZXNfZ3AgPSBncGFyKAoJCWZvbnRzaXplID0gMTAsCgkJY29sID0gaWZfZWxzZShyb3duYW1lcyguKSAlaW4lIHRSTkFnZUJCLCAicmVkIiwgImJsYWNrIikKCSksCglyb3dfdGl0bGUgPSAidFJOQSBnZW5lIgopCgpwbmcoCglmaWxlbmFtZSA9ICJncmFwaGljcy9zbG9wZUJ5VGlzc3VlQW5kdFJOQW1IZWF0TWFwX2JsLnBuZyIsCgl3aWR0aCA9IDcsIGhlaWdodCA9IDgsIHVuaXRzID0gImluIiwgcmVzID0gMTkyCikKc2xvcGVCeVRpc3N1ZUFuZHRSTkFtSGVhdE1hcApkZXYub2ZmKCkKCnNsb3BlQnlUaXNzdWVBbmR0Uk5BbUhlYXRNYXAKCnNsb3BlQnlUaXNzdWVBbmR0Uk5BbUFBc3BsaXRIZWF0TWFwIDwtIApzbG9wZUJ5VGlzc3VlQW5kdFJOQW0gJT4lCkhlYXRtYXAoCgluYV9jb2wgPSAiYmxhY2siLAoJaGVhdG1hcF93aWR0aCA9IHVuaXQoNS41LCAiaW5jaGVzIiksCgloZWF0bWFwX2hlaWdodCA9IHVuaXQoNy41LCAiaW5jaGVzIiksCgljb2x1bW5fdGl0bGVfZ3AgPSBncGFyKGZvbnRzaXplID0gMTYsIGZvbnRmYWNlID0gImJvbGQiKSwKCWNvbHVtbl90aXRsZSA9ICJDaGFuZ2UgaW4gRE5BbSB3aXRoIEFnZVxuYnkgdGlzc3VlIChzbG9wZSkiLAoJbmFtZSA9ICJzbG9wZVxuIiwKCWNvbHVtbl9uYW1lc19yb3QgPSA0NSwKCWNvbHVtbl9uYW1lc19ncCA9IGdwYXIoZm9udHNpemUgPSAxMCksCglyb3dfc3BsaXQgPSByb3duYW1lcyguKSAlPiUKCQlnc3ViKHBhdHRlcm4gPSAidFJOQS0oXFx3KyktXFx3Ky1cXHcrLVxcZCsiLCByZXBsYWNlbWVudCA9ICJcXDEiKSwKCXJvd19uYW1lc19ncCA9IGdwYXIoCgkJZm9udHNpemUgPSAxMCwKCQljb2wgPSBpZl9lbHNlKHJvd25hbWVzKC4pICVpbiUgdFJOQWdlQkIsICJyZWQiLCAiYmxhY2siKQoJKSwKCXJvd190aXRsZSA9ICJ0Uk5BIGdlbmUiCikKCnBuZygKCWZpbGVuYW1lID0gImdyYXBoaWNzL3Nsb3BlQnlUaXNzdWVBbmR0Uk5BbUFBc3BsaXRIZWF0TWFwX2JsLnBuZyIsCgl3aWR0aCA9IDcsIGhlaWdodCA9IDgsIHVuaXRzID0gImluIiwgcmVzID0gMTkyCikKc2xvcGVCeVRpc3N1ZUFuZHRSTkFtQUFzcGxpdEhlYXRNYXAKZGV2Lm9mZigpCgpzbG9wZUJ5VGlzc3VlQW5kdFJOQW1BQXNwbGl0SGVhdE1hcApgYGAKCiMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAKCiMgUmVmZXJlbmNlcwo=